//Test_2:传递堆参数给工作线程入口函数

#include<iostream>
#include<pthread.h>
#include<unistd.h>

using namespace std;

// 工作线程的入口函数
void* pthread_start(void* arg)
{
    int* i = (int*)arg;
    // 工作线程死循环不退出
    cout << "I'm a work thread!" << *i  << endl;
        
    //堆上开辟的变量在工作线程使用完后记得释放
    //因为主线程并不清楚工作线程什么时候用完该变量，因此只能由工作线程释放    
    delete i;
    sleep(1);
    return NULL;
}
int main()
{
    for(int i = 0; i < 5; ++i)
    {
       //1.创建一个工作线程
        pthread_t thread;
        
        //这里在堆上动态开辟
        int* p = new int;
        *p = i;
        int ret = pthread_create(&thread, NULL, pthread_start, (void*)p);

        if(ret < 0)
        {
            cout << "pthread_create Error!" << endl;
            return 0;
        }
        //这里不让主线程阻塞等待工作线程，所有工作线程抢占执行
        //sleep(1);
    }
    //2.主线程循环不退出，观察线程信息
    while(1)
    {
        cout << "I'm a main thread!" << endl;
        sleep(1);
    }
    return 0;
}
